package objetos;

import gui.Field;

import java.util.ArrayList;
import java.util.LinkedList;

import policia.Policia;


public class Cobra extends Thread  {

	private int size;
	private Field campo;
	private LinkedList<Posicao> posicoesCorpo;

	public Cobra(int tamanho, Field campo) {
		size = tamanho;
		this.campo = campo;		
		posicoesCorpo = new LinkedList<>();

		LinkedList<Posicao> posicoesCampo = campo.getPosicoes();	
		boolean espacoLivreParaCabeca = false;

		for (int i = 0 ; i < size ; i++) {
			if(i == 0){
				while(!espacoLivreParaCabeca){
					int indiceCabeca = (int) (Math.random()*campo.getPosicoes().size());
					boolean b = posicoesCampo.get(indiceCabeca).isOcupada();
					if(!b){
						Posicao p = posicoesCampo.get(indiceCabeca);
						posicoesCorpo.addFirst(p);
						espacoLivreParaCabeca = true;
						p.setOcupada(true);
						campo.pintarPosicao(posicoesCampo.get(indiceCabeca));
					}
				}
			}
			else{
				Posicao p = verificarPosicaoLivre(posicoesCorpo.get(i - 1));
				p.setOcupada(true);
				posicoesCorpo.add(p);
				campo.pintarPosicao(p);
			}
		}
	}

	@Override
	public void run() {
		while(true){
			try {
				sleep(100);
				Posicao cabeca = posicoesCorpo.get(0);
				Posicao novaPosicao = verificarPosicaoLivre(cabeca);
				novaPosicao.setOcupada(true);
				posicoesCorpo.addFirst(novaPosicao);
				campo.pintarPosicao(novaPosicao);
				campo.removerPosicao(posicoesCorpo.getLast());
				posicoesCorpo.remove(posicoesCorpo.getLast());
			} catch (InterruptedException e) {
				System.out.println("erro");
			}

		}
	}

	private Posicao verificarPosicaoLivre(Posicao p){
		boolean cima,baixo,esquerda,direita = false;
		int x = p.getX();
		int y = p.getY();

		int indiceEsquerda= p.getIndice()-1;
		if(indiceEsquerda<0)
			indiceEsquerda=0;
		int indiceDireita= p.getIndice()+1;
		if(indiceDireita>(campo.getNUM_COL()*campo.getNUM_LIN()))
			indiceDireita=campo.getNUM_COL()*campo.getNUM_LIN();
		
		// Esquerda
		if(campo.getPosicoes().get(indiceEsquerda).getX() >= 0 && !campo.getPosicoes().get(indiceEsquerda).isOcupada() 
				&& campo.getPosicoes().get(indiceEsquerda).getX() < x)
			return campo.getPosicoes().get(indiceEsquerda);
		// Direita
		else if(indiceDireita <= campo.getPosicoes().size() && !campo.getPosicoes().get(indiceDireita).isOcupada()
				&& campo.getPosicoes().get(indiceDireita).getX() > x)
			return campo.getPosicoes().get(p.getIndice()+1);
		// Cima 
		else if(p.getIndice()-campo.getNUM_COL() >= 0 && p.getIndice()-campo.getNUM_COL() <= campo.getPosicoes().size() 
				&& !campo.getPosicoes().get(p.getIndice()-campo.getNUM_COL()).isOcupada())
			return campo.getPosicoes().get(p.getIndice()-campo.getNUM_COL());
		// Baixo 
		else if(p.getIndice()+campo.getNUM_COL() >= 0 && p.getIndice()+campo.getNUM_COL() <= campo.getPosicoes().size() 
				&& !campo.getPosicoes().get(p.getIndice()+campo.getNUM_COL()).isOcupada())
			return campo.getPosicoes().get(p.getIndice()+campo.getNUM_COL());
		return p;
	}

	public void setCampo(Field campo) {
		this.campo = campo;
	}
}
